package it.unisalento.appsalento.activity.fragment;

import it.unisalento.R;
import it.unisalento.appsalento.activity.App;
import it.unisalento.appsalento.adapter.AppelliCalendarioAdapter;
import it.unisalento.appsalento.adapter.RisultatiAdapter;
import it.unisalento.appsalento.constants.Constants;
import it.unisalento.appsalento.model.Appello;
import it.unisalento.appsalento.model.Esame;

import java.text.SimpleDateFormat;
import java.util.ArrayList;

import android.app.Activity;
import android.app.Fragment;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;

public class DettaglioEsameFragment extends Fragment {
	private TextView mCodice;
	private TextView mNome;
	private TextView mCfu;
	private TextView mAnnoCorso;
	private TextView mTipo;
	private TextView mSuperamento;
	private TextView mStato;
	private TextView mListaRisultatiLbl;
	private ListView mListaRisultati;
	private TextView mListaAppelliLbl;
	private ListView mListaAppelli;
	private ArrayList<Appello> appelli = new ArrayList<Appello>();
	private ArrayList<Appello> risultati = new ArrayList<Appello>();
	private Esame esame;
	private AppelliCalendarioAdapter adapterAppelli;
	private RisultatiAdapter adapterRisultati;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		View rootView = inflater.inflate(R.layout.fragment_dettaglio_esame,container, false);

		mCodice = (TextView) rootView.findViewById(R.id.dettaglio_esame_codice);
		mNome = (TextView) rootView.findViewById(R.id.dettaglio_esame_nome);
		mCfu = (TextView) rootView.findViewById(R.id.dettaglio_esame_cfu);
		mAnnoCorso = (TextView) rootView.findViewById(R.id.dettaglio_esame_anno_corso);
		mTipo = (TextView) rootView.findViewById(R.id.dettaglio_esame_tipo);
		mSuperamento = (TextView) rootView.findViewById(R.id.dettaglio_esame_superamento);
		mStato = (TextView) rootView.findViewById(R.id.dettaglio_esame_stato);
		mListaRisultatiLbl = (TextView) rootView.findViewById(R.id.dettaglio_esame_lista_risultati_lbl);
		mListaRisultati = (ListView) rootView.findViewById(R.id.dettaglio_esame_lista_risultati);
		mListaAppelliLbl = (TextView) rootView.findViewById(R.id.dettaglio_esame_lista_appelli_lbl);
		mListaAppelli = (ListView) rootView.findViewById(R.id.dettaglio_esame_lista_appelli);
		
		adapterRisultati = new RisultatiAdapter(getActivity(), R.layout.row_risultato,
				risultati);
		mListaRisultati.setAdapter(adapterRisultati);
		
		adapterAppelli = new AppelliCalendarioAdapter(getActivity(), R.layout.row_appello_dettaglio_esame,
				appelli);
		mListaAppelli.setAdapter(adapterAppelli);
		
		esame = App.esameCorrente;
		
		if (esame!=null) {
			setView(esame, getActivity());
		}
		
		LocalBroadcastManager
		.getInstance(getActivity().getApplicationContext())
		.registerReceiver(mDettaglioReceiver,
				new IntentFilter(Constants.ESAME_DETTAGLIO_EVENT));

		return rootView;
	}
	
	/**
	 * Imposta la view
	 * @param esame
	 */
	private void setView(Esame esame, Activity activity) {
		mCodice.setText(esame.getCodice());
		mNome.setText(esame.getNomeEsame());
		mCfu.setText(esame.getCfu());
		mAnnoCorso.setText(esame.getAnnoCorso());
		mTipo.setText(esame.getTipoEsame());
		
		if(!"".equals(esame.getStato())){
		    String stato = esame.getStato().toUpperCase();
		    mStato.setText(stato);
		    
			if (stato.equals(Esame.STATO_S)) {
				mStato.setBackgroundColor(activity.getResources()
						.getColor(R.color.unisalento_esame_s));
			} else if (stato.equals(Esame.STATO_F)) {
				mStato.setBackgroundColor(activity.getResources()
						.getColor(R.color.unisalento_esame_f));
			} else if (stato.equals(Esame.STATO_P)) {
				mStato.setBackgroundColor(activity.getResources()
						.getColor(R.color.unisalento_esame_p));
			}
        }
		
		appelli.clear();
		mListaAppelliLbl.setVisibility(View.GONE);
		mListaAppelli.setVisibility(View.GONE);
		
		appelli.clear();
		risultati.clear();
		
		if (!esame.getAaSuperamento().equals("")) {
			mSuperamento.setText(activity
					.getResources()
					.getString(R.string.label_esame_superato)
						.concat(" ")
						.concat(new SimpleDateFormat(Constants.DD_MM_YY)
							.format(esame.getDataSuperamento()))
						.concat(" ")
						.concat(activity.getResources().getString(
							R.string.label_esame_votazione))
						.concat(" ")
						.concat(esame.getVoto())
						.concat(esame.getLode().equals(Appello.LODE) ? 
							esame.getLode() : "")
						.concat(activity.getResources().getString(
							R.string.label_esame_trentesimi)));
			mSuperamento.setVisibility(View.VISIBLE);
		} else {
			for (Appello appello : App.appelli) {
				if (appello.getCodiceEsame().equals(esame.getCodice())) {
					if (appello.getStato().equals(Appello.DA_ACCETTARE)
							|| appello.getStato().equals(Appello.RISULTATO_ACCETTATO)
							|| appello.getStato().equals(Appello.RISULTATO_RIFIUTATO)) {
						risultati.add(appello);
					} else {
						appelli.add(appello);
					}
				}
			}
		}
		
		if (risultati.size()>0) {
			mListaRisultatiLbl.setVisibility(View.VISIBLE);
			mListaRisultati.setVisibility(View.VISIBLE);
		}
		
		if (appelli.size()>0) {
			mListaAppelliLbl.setVisibility(View.VISIBLE);
			mListaAppelli.setVisibility(View.VISIBLE);
		}
		
		mListaRisultati.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View v,
					int position, long id) {
				final Appello appello = (Appello) parent
						.getItemAtPosition(position);
				
				Intent intent = new Intent(Constants.SHOW_RISULTATO_EVENT);
				intent.putExtra(Constants.APPELLO_ID_NAME, appello.getIdAppello());
				
				LocalBroadcastManager.getInstance(
					getActivity().getApplicationContext()).sendBroadcast(
					intent);
			}

		});
		
		mListaAppelli.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View v,
					int position, long id) {
				Appello appello = (Appello) parent.getItemAtPosition(position);

				Intent intent = new Intent(Constants.SHOW_APPELLO_EVENT);
				intent.putExtra(Constants.APPELLO_ID_NAME, appello.getIdAppello());
				
				LocalBroadcastManager.getInstance(
					getActivity().getApplicationContext()).sendBroadcast(
					intent);
			}

		});
	}

	private BroadcastReceiver mDettaglioReceiver = new BroadcastReceiver() {
		@Override
		public void onReceive(Context context, Intent intent) {
			String codiceEsame = intent
					.getStringExtra(Constants.ESAME_COD_EXTRA_NAME);

			for (Esame mEsame : App.listaEsami) {
				if (mEsame.getCodice().equals(codiceEsame)) {
					esame = mEsame;
					break;
				}
			}

			if (esame == null) {
				// TODO: gestire la casistica di errore
				return;
			}

			setView(esame, getActivity());
		}
	};
}
